/**
 *
 */
export function roundFixed(value, precision = 2) {
  return parseFloat(value.toFixed(precision))
}

// 四舍五入取整，最多保留小数点后 precision 位
export function roundFormat(value, precision = 2) {
  if(value == null || value === '') return 0
  return Math.round(Number(value) * Math.pow(10, precision)) / Math.pow(10, precision)
}

// 向上取整，最多保留小数点后 precision 位
export function ceilFormat(value, precision = 2) {
  if(value == null || value === '') return 0
  return Math.ceil(Number(value) * Math.pow(10, precision)) / Math.pow(10, precision)
}

// 向下取整，最多保留小数点后 precision 位
export function floorFormat(value, precision = 2) {
  if(value == null || value === '') return 0
  return Math.floor(Number(value) * Math.pow(10, precision)) / Math.pow(10, precision)
}

export function percentFormat(val) {
  if(val == null || Number.isNaN(val)) {
    return '--'
  } else {
    return floorFormat(val / 100, 2) + '%'
  }
}

export function toFixed(val, precision, defaultValue = '0') {
  if(val == null || val === '' || Number.isNaN(val)) {
    return defaultValue
  } else {
    return Number(val).toFixed(precision)
  }
}

export function normalizeNumberKeyDown_01(e, precision) {
  const value = e.target.value
  const index = value.indexOf('.')
  // 可以是Ctrl+V
  if(e.ctrlKey === 1 && e.keyCode === 86) {
    return true
  }
  // 可以是删除按键
  if(e.keyCode === 8) {
    return true
  }
  // 只能输数字和小数点
  if(e.keyCode !== 190 && (e.keyCode < 48 || e.keyCode > 57)) {
    return false
  }
  // 小数点只能有一个
  if(e.keyCode === 190) {
    return index < 0
  }
  // 小数点后面最多只能有precision位
  if(index > 0 && value.length > index + precision + 1) {
    return false
  }
}

export function normalizeNumberKeyUp_01(e, precision) {
  // 只能是数字、小数点
  const target = e.target
  let value = target.value.replace(/[^0-9.]/ig, '')
  // 整数部分只能是0
  if(value.length === 1 && value !== '0') {
    value = '0.'
  } else {
    const index = value.indexOf('.')
    if(index > 0) {
      // 判断是否有两个小数点
      const index2 = value.indexOf('.', index + 1)
      if(index2 >= 0) {
        value = value.substring(0, index2)
      }
      // 小数点后面最多只能有precision位
      if(value.length > index + precision + 1) {
        value = value.substring(0, index + precision + 1)
      }
    }
  }
  target.value = value
  return value
}

export function normalizeDigitKeyDown(e, min, max) {
  const value = e.target.value
  // 可以是Ctrl+V
  if(e.ctrlKey === 1 && e.keyCode === 86) {
    return true
  }
  // 可以是删除按键
  if(e.keyCode === 8) {
    return true
  }
  // 只能输数字
  if(e.keyCode < 48 || e.keyCode > 57) {
    return false
  }
  // console.log(e.keyCode)
  // 数字值必须介于min、max之间
  if(value >= max) {
    return false
  }
}

export function normalizeDigitKeyUp(e, min, max) {
  const target = e.target
  // 取整数部分
  let value = target.value.replace(/\D/g, '')
  // 界定值范围
  if(value < min) value = min
  if(value > max) value = max
  target.value = value
  return value
}

export function normalizeNumberKeyDown(e, precision) {
  const value = e.target.value
  const index = value.indexOf('.')
  // 可以是Ctrl+V
  if(e.ctrlKey === 1 && e.keyCode === 86) {
    return true
  }
  // 可以是删除按键
  if(e.keyCode === 8) {
    return true
  }
  // 只能输数字和小数点
  if(e.keyCode !== 190 && (e.keyCode < 48 || e.keyCode > 57)) {
    return false
  }
  // 小数点只能有一个
  if(e.keyCode === 190) {
    return index < 0
  }
  // 小数点后面最多只能有precision位
  if(index > 0 && value.length > index + precision + 1) {
    return false
  }
}

export function normalizeNumberKeyUp(e, precision) {
  // 只能是数字、小数点
  const target = e.target
  console.log(e);
  let value = target.value.replace(/[^\d.]/ig, '')
  const index = value.indexOf('.')
  if(index > 0) {
    // 判断是否有两个小数点
    const index2 = value.indexOf('.', index + 1)
    if(index2 >= 0) {
      value = value.substring(0, index2)
    }
    // 小数点后面最多只能有precision位
    if(value.length > index + precision + 1) {
      value = value.substring(0, index + precision + 1)
    }
  }
  target.value = value
  return value
}

export const normalizeNumber = (value, max = 999999999) => {
  const newValue = String(value).replace(/[^\d.]/ig, '')
  const dotIndex = newValue.indexOf('.')
  let num = 0
  if(dotIndex === -1) {
    num = Math.min(Number(newValue), max)
  } else {
    const s1 = newValue.substring(0, dotIndex)
    let s2 = ''
    for(let i = dotIndex + 1; i < newValue.length; i++) {
      const char = newValue.charAt(i)
      if(char !== '.') {
        s2 += char
        if(s2.length >= 2) break
      }
    }
    const s = Number(s1 + '.' + s2) // 最多两位小数
    num = Math.min(s, max)
  }
  return num
}

export const normalizeNumberString = (value, min, max) => {
  const newValue = String(value).replace(/[^\d.]/ig, '')
  const dotIndex = newValue.indexOf('.')
  let s = 0
  if(dotIndex === -1) {
    s = newValue
  } else {
    const s1 = newValue.substring(0, dotIndex)
    let s2 = ''
    for(let i = dotIndex + 1; i < newValue.length; i++) {
      const char = newValue.charAt(i)
      if(char !== '.') {
        s2 += char
        if(s2.length >= 2) break
      }
    }
    s = s1 + '.' + s2 // 最多两位小数
  }
  const num = Number(s)
  if(num < min) s = String(min)
  if(num > max) s = String(max)
  return s
}

export const normalizeDigitString = (value, min, max) => {
  const s = String(value).replace(/\D/ig, '')
  let num = Number(s)
  if(num < min) num = min
  if(num > max) num = max
  return num
}

export const normalizePercent = (value) => {
  const newValue = String(value).replace(/[^\d.]/ig, '')
  const dotIndex = newValue.indexOf('.')
  let percent = 0
  if(dotIndex === -1) {
    percent = Math.min(Number(newValue), 100)
  } else {
    const s1 = newValue.substring(0, dotIndex)
    let s2 = ''
    for(let i = dotIndex + 1; i < newValue.length; i++) {
      const char = newValue.charAt(i)
      if(char !== '.') {
        s2 += char
        if(s2.length >= 2) break
      }
    }
    const s = Number(s1 + '.' + s2) // 最多两位小数
    percent = Math.min(s, 100)
  }
  return percent
}

export const normalizeDigit = (value, minValue, maxValue) => {
  const rank = Number(String(value).replace(/\D/ig, ''))
  return Math.max(minValue, Math.min(rank, maxValue))
}
